最も基本的なタイプのキャッシュ・グループは、TimesTenで単一のOracle表をキャッシュするキャッシュ・グループです。複数の表を単一のキャッシュ・グループにキャッシュする処理は複雑であるため、Cache Connect to Oracleの概念の詳細を理解している必要があります。
通常、キャッシュされる各Oracle表には、1つ以上の主キーまたはNULLでない一意索引キーが必要です。また、TimesTenキャッシュ・グループ表で定義されている主キーおよび一意索引は、Oracle表の主キーおよび一意索引と一致している必要があります。たとえば、Oracle表に主キーまたは一意索引列C1、C2およびC3がある場合、キャッシュされた表の対応するTimesTenの主キーにも列C1、C2およびC3が必要です。Oracleの1次索引および一意索引とキャッシュ・グループ表の1次索引および一意索引が一致しない場合は、キャッシュ・グループが制限され、AUTOREFRESH機能またはPROPAGATE機能を使用できません。詳細は、「制限付きキャッシュ・グループについて」を参照してください。
非一意索引は、TimesTenキャッシュ表に対して無制限に作成できます。索引をキャッシュ表に追加すると、非キャッシュTimesTen表と同様の方法でSQLを高速化できます。不適切な一意制約による障害が発生することがあるため、Oracle表の一意索引と一致しない一意索引は作成しないでください。
この項の内容は次のとおりです。
次のように、単純なキャッシュ・グループ定義を作成して、単一表をキャッシュします。
ここで、
図2.11に、CUSTOMER Oracle表をキャッシュするためのTargetCustomersという単一表のREADONLYキャッシュ・グループを示します。TimesTenキャッシュ・グループのデータは、Oracleデータベースに保存されているすべての顧客に関する大量のデータ・セットのサブセットです。
単一表のTargetCustomersキャッシュ・グループの作成に使用されるCREATE READONLY CACHE GROUP文は、次のとおりです。
複数のOracle表が同じキャッシュ・グループにキャッシュされる場合は、1つのルート表および1つ以上の子表を定義する必要があります。1つのキャッシュ・グループに存在できるルート表は、1つのみです。
複数の表を持つキャッシュ・グループでは、キャッシュ・グループ内の各子表は、外部キー制約を使用してキャッシュ・グループ内のルート表または別の子表と結合する必要があります。TimesTenでは外部キー制約を使用してキャッシュ・グループ内の表を結合する必要がありますが、Oracleインスタンスでは結合する必要はありません。キャッシュ・グループ内のルート表は、外部キー制約を介してキャッシュ・グループ内の他のすべての表を参照しません。キャッシュ・グループ内の他のすべての表は子表です。
各表定義には、キャッシュされた表の1つ以上の列に対して主キーが含まれている必要があります。また、各子表には、親表の主キーに対する外部キー参照が含まれている必要があります。キャッシュ・グループの表の階層では、他の子表の親になるように子表を指定できますが、キャッシュ・グループ内の表は、キャッシュ・グループ内の複数の親の子になることはできません。適切なキャッシュ・グループ表の構成の例は、例2.2を参照してください。図2.13に不適切な表設定を示し、図2.14に問題の回避策を示します。
各Oracle表がキャッシュに含まれるように、キャッシュ・グループ内で個別の表定義を作成する必要があります。キャッシュ・グループ内の表定義の所有者および名前は、Oracle表の所有者および名前と一致している必要があります。表定義を作成すると、Oracle表の列のすべてまたはサブセットをキャッシュできます。
次のように、単純なキャッシュ・グループ定義を作成して、1つのRootTableおよび1つのChildTableをキャッシュします。
ここで、
図2.12に、前述の図2.11で示したTargetCustomersキャッシュ・グループの複数表バージョンを示します。この例では、キャッシュ・グループは3つのOracle表Customer、OrdersおよびOrder_Itemをキャッシュするように拡張されています。キャッシュ・グループのデータは、Oracleデータベースに保存されているすべての顧客に関する大量のデータ・セットのサブセットです。TargetCustomersキャッシュ・グループ内の各親表は、主キー(太字で示されています)を持ち、外部キー関係を介して子表によって参照されます(矢印で示されています)。Customer表は、キャッシュ・グループ内の別の表を参照しないため、ルート表になります。Customer表の主キーは、TargetCustomersキャッシュ・グループの主キーです。OrdersおよびOrder_Item表は子表です。
OracleからTimesTen USERMANAGEDキャッシュ・グループにロードされる基本単位は、キャッシュ・インスタンスで、外部キー関係を介してキャッシュ・グループのルート表の特定の行に関連付けられている行のセットを記述します(『Oracle TimesTen In-Memory Databaseアーキテクチャ概要』のCache Connect to Oracleに関する章のキャッシュ・インスタンスの項を参照)。ルート表の主キー122によって識別されるキャッシュ・インスタンスは、キャッシュ・グループの各表内で強調表示されています。このキャッシュ・インスタンス・キーによって、ルート表の行およびこの行を参照する子表のすべての関連行が識別されます。
複数表のTargetCustomersキャッシュ・グループの作成に使用されるCREATE READONLY CACHE GROUP文は、次のとおりです。
図2.13に、キャッシュ・グループの不適切な表の構成の例を示します。Customer、OrdersおよびOrder_Item表と同じキャッシュ・グループのデモ・スキーマからProductsおよびInventory表を定義することはできません。Products表にはルート表Customersへの(直接または間接の)外部キー参照がないためです。つまり、Products表もルート表とみなされ、1つのキャッシュ・グループは1つ以上のルート表を持つことができないため無効となります。
図2.14に示すように、TimesTenデモ・スキーマのすべての表をキャッシュするために、ProductsおよびInventory表に対して2つ目のキャッシュ・グループを作成できます。
通常のOracle表をキャッシュする場合と同じ表記規則に従って、キャッシュ・グループ内のOracleパーティション表を定義できます。たとえば、READONLYキャッシュ・グループ内のパーティション表には、対応するNULLでない一意の索引がOracle内に必要です。キャッシュ・グループで使用されるパーティション表は、任意の方法(ハッシュ、リスト、範囲または複合)でパーティション化またはサブパーティション化できます。
個々のパーティションは、制限付きキャッシュ・グループ内に間接的にキャッシュできます。たとえば、キャッシュ・グループを作成して、表のパーティションのマテリアライズド・ビューをキャッシュできます。最初に、個々のパーティションを参照するマテリアライズド・ビューをOracleで作成し、次に、マテリアライズド・ビューをキャッシュします(例2.4を参照)。
Oracleでは、表partitioned_tableのパーティションF200402に保存されたデータのマテリアライズド・ビューmv_ptを次のように定義します。
次に、制限付きユーザー管理キャッシュ・グループを作成して、マテリアライズド・ビューmv_ptをキャッシュします。
Oracleパーティション表をキャッシュする場合は、次の制限が適用されます。
キャッシュ・グループの表定義は、Oracle実表のOracleプライベート・シノニムを参照できます。実際のOracle実表は別のOracleスキーマ内に存在し、異なる名前を持つことができますが、シノニムと同じOracleサーバーに存在している必要があります。キャッシュ・グループの表名は、プライベート・シノニムの名前である必要がありますが、このシノニムは別のシノニムを示すことができます。この別のシノニムには、パブリックまたはプライベートのいずれのシノニムでも使用できます。シノニムは、最終的に、表、パーティション表またはマテリアライズド・ビューを(直接的または間接的に)示す必要があります。
Oracleシノニムに対する表定義が含まれているキャッシュ・グループは、USERMANAGED、SWTまたはAWTキャッシュ・グループです。USERMANAGEDキャッシュ・グループは、エージングに対してDURATION属性を指定して構成し、LOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUPおよびFLUSH CACHE GROUP処理をサポートすることができますが、AUTOREFRESHまたはREADONLY属性を指定して構成することはできません。READONLYキャッシュ・グループ内のOracleシノニムに対して表定義を持つことはできません。
次の場合、キャッシュ・グループは制限付きと呼ばれます。
キャッシュ・グループが制限されている場合は、Oracleからキャッシュ・グループにデータをロードする場合に重複キー・エラーが無視されます。制限付きキャッシュ・グループのロード時に重複キー・エラーをレポートする必要がある場合は、CREATE INDEXを使用して、Oracle表の主キーに対応するキャッシュ・グループ表の列に対して一意索引を作成できます。制限付きキャッシュ・グループのロード中に主キー違反がある場合は、キャッシュにロードされた行がすべての重複行の中からランダムに選択されます。
制限付きキャッシュ・グループは、1つのOracle表のみの内容をキャッシュできます。LOAD CACHE GROUP、UNLOAD CACHE GROUPおよびREFRESH CACHE GROUPの処理は、WHERE句が含まれていない場合、制限付きキャッシュ・グループで実行できます。FLUSH CACHE GROUP処理は、制限付きキャッシュ・グループでは実行できません。主キーまたは一意索引を持たないOracle表に対して制限付きキャッシュ・グループを作成することはできますが、キャッシュ・グループの内容をOracleに自動リフレッシュまたは伝播することはできません。
Oracle表に対応する表をキャッシュ・グループに作成する場合は、Oracle表の列ごとにTimesTenデータ型を選択する必要があります。使用可能なOracle/TimesTenデータ型のマッピングおよびデータ型変換ルールの詳細は、「キャッシュ・グループの作成のためにサポートされているOracleデータ型」を参照してください。
次のOracle表の例では、TimesTenキャッシュ・グループで別々にマップする必要がある多数のデータ型が含まれています。
これらのOracle表をキャッシュするには、次の表定義を使用してTimesTenにキャッシュ・グループを作成します。
例2.5では、USER1.T1はルート表、USER1.T2はUSER1.T1の子表、USER1.T3はUSER1.T2の子表です。
OracleのNUMBER(x,0)型は、xで指定される最大データ長に最も近いTimesTenのINTEGER型にマップできます。列T1.C1およびT2.C5で示されているように、TimesTenのINTEGERは、OracleのNUMBER(10,0)に最も近い型です。ただし、値が-32,768から32,767の範囲にあることがわかっている場合は、Oracle NUMBER(10,0)をTimesTen SMALLINTにマップできます。Oracle NUMBERはTimesTen VARCHARにマップできます。例の列T3.C10で示されているように、Oracle NUMBER(p,s)型は、TimesTen DECIMAL(p,s)またはNUMERIC(p,s)にマップできます。ここで、精度(p)およびスケール(s)は同じです。
Oracle LONG型は、TimesTen VARCHAR(x)にマップできます。ここで、xは列の最大データ長です。T1.C3の最大長は5000バイトです。
Oracle RAWまたはLONG RAW型は、TimesTen VARBINARY(x)にマップできます。ここで、xは列の最大データ長です。T3.C7の最大長は21バイト、T3.C11の最大長は3,000,000バイトです。
Oracle TIMESTAMP(6)は、列T2.C6およびT3.C9のように、TimesTen TIMESTAMPにマップできます。
Oracle VARCHAR2(x)は、TimesTen VARCHAR(x)にマップできます。ここで、xは列の最大データ長です。この最大値は両方の型で同じですが、2000を超えないようにする必要があります。列T3.C8の最大長は15バイトです。これらの型をこの方法でマップすると、VARCHAR比較ルールがOracleで異なることを示す警告が生成されます。文字列比較では、文字列の後続空白が重要であるためです。文字列比較で、列を主キーとして使用すると、OracleとTimesTen間で非互換性が生じる可能性があります。たとえば、Oracleでは、値「abc」と「abc 」は一意で、異なる主キーとみなされます。一方、TimesTenでは、これらの値は同一とみなされ、重複キー・エラーが生成されます。TimesTenでは、後続空白は保存され、Oracleへの値の伝播時に失われないため、この非互換性は比較処理に対してのみ適用されます。
例2.5に示すキャッシュ・グループを作成すると、列T2.C4とT2.C5がOracleで異なるNULL値可能設定を持つことを示す警告メッセージが生成されます。OracleとTimesTen間では、NULL値可能設定に一貫性を持たせることをお薦めしますが、主キーとして使用されていない列では、このような違いは許容されます。